﻿using Bot.Domain.Bo;
using Bot.Domain.Entities;
using Bot.Domain.Enum;
using Bot.Domain.Interfaces;
using Bot.Domain.Specifications;
using Comm100.Framework.Domain.Repository;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace Bot.Domain
{
    public interface IVerifyDataManager
    {

    }
    /// <summary>
    /// 公用校验部分
    /// </summary>
    public class VerifyDataManager : IVerifyDataManager
    {

        public VerifyDataManager()
        {
        }

        //public ErrorInfo ResponseValidation(Response response, string channelType, Guid botId, int siteId, bool isSupportComplex = false)
        //{
        //    string channel = channelType.ToLower();
        //    if (channel == "default")
        //    {
        //        if (response.type != EnumAnswerType.text
        //            && response.type != EnumAnswerType.button
        //            && response.type != EnumAnswerType.quickReply)
        //        {
        //            return APIHelper.GetErrorMessageByCode(51351);
        //        }
        //    }
        //    List<string> openInLst = new List<string>();
        //    openInLst.Add(EnumOpenIn.currentWindow.ToString());
        //    openInLst.Add(EnumOpenIn.newWindow.ToString());
        //    openInLst.Add(EnumOpenIn.sideWindow.ToString());
        //    List<string> openStyleLst = new List<string>();
        //    openStyleLst.Add(EnumOpenStyle.compact.ToString());
        //    openStyleLst.Add(EnumOpenStyle.full.ToString());
        //    openStyleLst.Add(EnumOpenStyle.tall.ToString());
        //    List<string> typeLst = new List<string>();
        //    typeLst.Add(EnumButtonType.goToIntent.ToString());
        //    typeLst.Add(EnumButtonType.link.ToString());
        //    typeLst.Add(EnumButtonType.webView.ToString());
        //    JObject jObj = response.content as JObject;
        //    switch (response.type)
        //    {
        //        case EnumAnswerType.text:
        //            TextResponse textResponse = jObj.ToNullableObject<TextResponse>();
        //            if (textResponse == null || textResponse.texts == null || textResponse.texts.Length <= 0)
        //                return APIHelper.GetErrorMessageByCode(51221);
        //            else if (textResponse.texts.Length > 10)
        //                return APIHelper.GetErrorMessageByCode(51222);
        //            string totalText = string.Join(CommonCharacter.Split, textResponse.texts);
        //            if (totalText.Length > 4000)
        //                return APIHelper.GetErrorMessageByCode(51364);
        //            else if (textResponse.texts.Any(a => string.IsNullOrWhiteSpace(a)))
        //                return APIHelper.GetErrorMessageByCode(51223);
        //            if (channel != "livechat")
        //            {
        //                if (textResponse.texts.Any(a => a.Contains("href=\"intent") || a.Contains("href='intent") || a.Contains("data-intent")))
        //                    return APIHelper.GetErrorMessageByCode(51363);
        //            }
        //            break;
        //        case EnumAnswerType.image:
        //            var imageResponse = jObj.ToNullableObject<ImageResponse>();
        //            if (imageResponse == null)
        //                return APIHelper.GetErrorMessageByCode(51224);
        //            if (string.IsNullOrWhiteSpace(imageResponse.name))
        //                return APIHelper.GetErrorMessageByCode(51225);
        //            if (string.IsNullOrWhiteSpace(imageResponse.url))
        //                return APIHelper.GetErrorMessageByCode(51226);
        //            if (imageResponse.name.Length > 260)
        //                return APIHelper.GetErrorMessageByCode(51227);
        //            if (imageResponse.url.Length > 1280)
        //                return APIHelper.GetErrorMessageByCode(51228);
        //            break;
        //        case EnumAnswerType.video:
        //            var videoResponse = jObj.ToNullableObject<UrlResponse>();
        //            if (videoResponse == null)
        //                return APIHelper.GetErrorMessageByCode(51229);
        //            if (string.IsNullOrWhiteSpace(videoResponse.url))
        //                return APIHelper.GetErrorMessageByCode(51230);
        //            if (videoResponse.url.Length > 1280)
        //                return APIHelper.GetErrorMessageByCode(51231);
        //            break;
        //        case EnumAnswerType.webhook:
        //            var webhookResponse = jObj.ToNullableObject<WebhookResponse>();
        //            if (webhookResponse == null)
        //                return APIHelper.GetErrorMessageByCode(51232);
        //            if (string.IsNullOrWhiteSpace(webhookResponse.url))
        //                return APIHelper.GetErrorMessageByCode(51233);
        //            if (webhookResponse.url.Length > 1280)
        //                return APIHelper.GetErrorMessageByCode(51234);
        //            if (webhookResponse.headers != null && webhookResponse.headers.Count > 0)
        //            {
        //                if (webhookResponse.headers.Any(a => string.IsNullOrWhiteSpace(a.Key)))
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51381);
        //                }
        //                if (webhookResponse.headers.Any(a => !string.IsNullOrWhiteSpace(a.Key) && a.Key.Length > 4000))
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51384);
        //                }
        //                if (webhookResponse.headers.Any(a => string.IsNullOrWhiteSpace(a.Value)))
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51382);
        //                }
        //                if (webhookResponse.headers.Any(a => !string.IsNullOrWhiteSpace(a.Value) && a.Value.Length > 4000))
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51385);
        //                }
        //            }

        //            break;
        //        case EnumAnswerType.quickReply:
        //            var quickReplyResponse = jObj.ToNullableObject<QuickReplyResponse>();
        //            if (quickReplyResponse == null)
        //            {
        //                JToken jtId = null;
        //                if (jObj == null || !jObj.TryGetValue("quickReplyId", out jtId) || jtId == null)
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51235);
        //                }

        //                if (!Guid.TryParse(jtId.ToString(), out Guid quickReplyId))
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51358);
        //                }
        //                return APIHelper.GetErrorMessageByCode(51235);
        //            }
        //            //2019.7.16 允许为空
        //            //if (string.IsNullOrWhiteSpace(quickReplyResponse.text))
        //            //    return APIHelper.GetErrorMessageByCode(51236);
        //            if (!string.IsNullOrWhiteSpace(quickReplyResponse.text) &&
        //                quickReplyResponse.text.Length > 1280)
        //                return APIHelper.GetErrorMessageByCode(51237);
        //            if (quickReplyResponse.quickReplyId == Guid.Empty)
        //                return APIHelper.GetErrorMessageByCode(51238);
        //            var quickReply = _quickReplyService.GetById(botId, quickReplyResponse.quickReplyId);
        //            if (quickReply == null)
        //                return APIHelper.GetErrorMessageByCode(51324, new object[] { quickReplyResponse.quickReplyId });
        //            if (quickReply.SiteId != siteId)
        //                return APIHelper.GetErrorMessageByCode(51325, new object[] { quickReplyResponse.quickReplyId, siteId });
        //            if (quickReply.BotId != botId)
        //                return APIHelper.GetErrorMessageByCode(51326, new object[] { quickReplyResponse.quickReplyId, botId });
        //            break;
        //        case EnumAnswerType.button:
        //            var buttonResponse = jObj.ToNullableObject<ButtonResponse>();
        //            if (buttonResponse == null)
        //            {
        //                JToken jtObject = null;
        //                if (jObj == null || !jObj.TryGetValue("buttons", out jtObject) || jtObject == null)
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51239);
        //                }
        //                var jtArray = jtObject.ToArray();
        //                if (jtArray.Length <= 0)
        //                    return APIHelper.GetErrorMessageByCode(51242);
        //                foreach (var item in jtArray)
        //                {
        //                    var type = item.SelectToken("type");
        //                    if (type == null || !typeLst.Contains(type.ToString()))
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(51246);
        //                    }
        //                    var intentId = item.SelectToken("intentId");
        //                    string pattern = "^[0-9]*$";
        //                    if (intentId == null && type.ToString() == EnumButtonType.goToIntent.ToString())
        //                        return APIHelper.GetErrorMessageByCode(51249);
        //                    if (intentId != null&&!Guid.TryParse(intentId.ToString(), out Guid id))
        //                        return APIHelper.GetErrorMessageByCode(51359);
        //                    var openIn = item.SelectToken("openIn");
        //                    if (openIn == null && type.ToString() == EnumButtonType.link.ToString()
        //                        && channel == "livechat")
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(51244);
        //                    }
        //                    if (openIn != null && !openInLst.Contains(openIn.ToString()))
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(51360);
        //                    }
        //                    var openStyle = item.SelectToken("openStyle");
        //                    if (openStyle == null && type.ToString() == EnumButtonType.webView.ToString()
        //                        && (channel == "livechat"))
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(51245);
        //                    }
        //                    if (openStyle != null && !openStyleLst.Contains(openStyle.ToString()))
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(51361);
        //                    }
        //                }
        //                return APIHelper.GetErrorMessageByCode(51239);
        //            }
        //            if (string.IsNullOrWhiteSpace(buttonResponse.text))
        //                return APIHelper.GetErrorMessageByCode(51240);
        //            if (buttonResponse.text.Length > 4000)
        //                return APIHelper.GetErrorMessageByCode(51241);
        //            if (buttonResponse.buttons == null || buttonResponse.buttons.Length <= 0)
        //                return APIHelper.GetErrorMessageByCode(51242);

        //            if (channel != "livechat")
        //            {//2019.6.26
        //                if (buttonResponse.buttons.Length > 3)
        //                    return APIHelper.GetErrorMessageByCode(51243);
        //            }

        //            foreach (var item in buttonResponse.buttons)
        //            {
        //                if (item.type == EnumButtonType.link
        //                    && !openInLst.Contains(item.openIn.ToString())
        //                    && channel == "livechat")
        //                    return APIHelper.GetErrorMessageByCode(51244);
        //                if (item.type == EnumButtonType.webView
        //                    && !openStyleLst.Contains(item.openStyle.ToString())
        //                    && (channel == "livechat"))
        //                    return APIHelper.GetErrorMessageByCode(51245);
        //                if (!typeLst.Contains(item.type.ToString()))
        //                    return APIHelper.GetErrorMessageByCode(51246);
        //                if (string.IsNullOrWhiteSpace(item.text))
        //                    return APIHelper.GetErrorMessageByCode(51247);

        //                if (channel =="livechat")
        //                {//2019.6.26
        //                    if (item.text.Length > 128)
        //                        return APIHelper.GetErrorMessageByCode(51377);
        //                }
        //                else
        //                {
        //                    if (item.text.Length > 20)
        //                        return APIHelper.GetErrorMessageByCode(51248);
        //                }

        //                if (item.type == EnumButtonType.goToIntent && channel != "livechat")
        //                    return APIHelper.GetErrorMessageByCode(51346);
        //                if (item.type == EnumButtonType.goToIntent && item.intentId == Guid.Empty)
        //                    return APIHelper.GetErrorMessageByCode(51249);
        //                if (item.type == EnumButtonType.goToIntent)
        //                {
        //                    var intentBasic = _botIntentsService.GetById(item.intentId);
        //                    if (intentBasic == null)
        //                        return APIHelper.GetErrorMessageByCode(51310, new object[] { item.intentId });
        //                    if (intentBasic.SiteId != siteId)
        //                        return APIHelper.GetErrorMessageByCode(51311, new object[] { item.intentId, siteId });
        //                    if (intentBasic.BotId != botId)
        //                        return APIHelper.GetErrorMessageByCode(51312, new object[] { item.intentId, botId });
        //                }
        //                //if (item.type == EnumButtonType.goToIntent && string.IsNullOrWhiteSpace(item.intentName))
        //                //    return 51250;
        //                //if (item.type == EnumButtonType.goToIntent && item.intentName.Length > 100)
        //                //    return 51251;
        //                if ((item.type == EnumButtonType.link || item.type == EnumButtonType.webView) && string.IsNullOrWhiteSpace(item.linkUrl))
        //                    return APIHelper.GetErrorMessageByCode(51252);
        //                if ((item.type == EnumButtonType.link || item.type == EnumButtonType.webView) && item.linkUrl.Length > 1280)
        //                    return APIHelper.GetErrorMessageByCode(51253);
        //            }
        //            break;
        //        case EnumAnswerType.complex:
        //            if (isSupportComplex)
        //            {
        //                if (channelType != "livechat")
        //                {
        //                    return APIHelper.GetErrorMessageByCode(51352);
        //                }
        //                var complexResponse = jObj.ToNullableObject<ComplexResponse>();
        //                if (complexResponse == null)
        //                    return APIHelper.GetErrorMessageByCode(51343);
        //                if (string.IsNullOrWhiteSpace(complexResponse.text))
        //                    return APIHelper.GetErrorMessageByCode(51342);
        //            }
        //            else
        //            {
        //                return APIHelper.GetErrorMessageByCode(51344);
        //            }
        //            break;
        //        case EnumAnswerType.authentication:

        //            break;
        //        case EnumAnswerType.location:

        //            break;
        //        case EnumAnswerType.viaForm:

        //            break;
        //        case EnumAnswerType.viaPrompts:

        //            break;
        //        default:
        //            return APIHelper.GetErrorMessageByCode(51341);
        //    }
        //    return null;
        //}
        //public ErrorInfo EntityNameCheck(string name)
        //{
        //    if (string.IsNullOrEmpty(name))
        //        return APIHelper.GetErrorMessageByCode(52205);
        //    if (name.Length > 30) return APIHelper.GetErrorMessageByCode(52206);
        //    if (name.ToLower().Equals("default")) return APIHelper.GetErrorMessageByCode(52207);
        //    string regexStr = @"^(?![0-9_-])[a-zA-Z0-9_-]{1,30}$";
        //    if (name.Trim().EndsWith("_") || name.Trim().EndsWith("-")
        //        || name.Trim().StartsWith("_") || name.Trim().StartsWith("-") || !Regex.IsMatch(name, regexStr))
        //        return APIHelper.GetErrorMessageByCode(52208);
        //    return null;
        //}
        //public ErrorInfo EntityItemNameCheck(Com.Comm100.Public.Bot.Entity entity)
        //{
        //    Regex reg = new Regex("[\\\\<>^()|]", RegexOptions.IgnoreCase);
        //    if (entity.Keywords != null && entity.Keywords.Count > 0)
        //    {
        //        List<string> keywords = new List<string>();
        //        foreach (var item in entity.Keywords)
        //        {
        //            if (string.IsNullOrWhiteSpace(item.Keyword))
        //                return APIHelper.GetErrorMessageByCode(52209);
        //            var keyword = item.Keyword.Trim();
        //            if (keyword.Length > 128)
        //                return APIHelper.GetErrorMessageByCode(52210);
        //            if (keyword.StartsWith("_") || keyword.EndsWith("_"))
        //                return APIHelper.GetErrorMessageByCode(52211);
        //            if (keyword.StartsWith("@"))
        //                return APIHelper.GetErrorMessageByCode(52212);
        //            if (reg.IsMatch(keyword) || keyword.Contains("*_") || keyword.Contains("_*") || keyword.Contains("&_") || keyword.Contains("_&"))
        //                return APIHelper.GetErrorMessageByCode(52213);
        //            if (!keyword.CheckSpecialCharacter('{', '}'))
        //                return APIHelper.GetErrorMessageByCode(52214);
        //            if (!keyword.CheckSpecialCharacter('[', ']'))
        //                return APIHelper.GetErrorMessageByCode(52215);
        //            if (!keyword.CheckSpecialCharacter('"', '"'))
        //                return APIHelper.GetErrorMessageByCode(52216);
        //            if (keywords.Contains(keyword))
        //                return APIHelper.GetErrorMessageByCode(52239);
        //            keywords.Add(keyword);
        //            if (item.Synonyms != null && item.Synonyms.Count > 0)
        //            {
        //                foreach (var synonyms in item.Synonyms)
        //                {
        //                    if (string.IsNullOrWhiteSpace(synonyms))
        //                        return APIHelper.GetErrorMessageByCode(52217);
        //                    if (synonyms.Length > 128)
        //                        return APIHelper.GetErrorMessageByCode(52218);
        //                    if (synonyms.StartsWith("_") || synonyms.EndsWith("_"))
        //                        return APIHelper.GetErrorMessageByCode(52219);
        //                    if (synonyms.StartsWith("@"))
        //                        return APIHelper.GetErrorMessageByCode(52220);
        //                    if (synonyms.Contains(","))
        //                        return APIHelper.GetErrorMessageByCode(52237);
        //                    if (reg.IsMatch(synonyms) || synonyms.Contains("*_") || synonyms.Contains("_*") || synonyms.Contains("&_") || synonyms.Contains("_&"))
        //                        return APIHelper.GetErrorMessageByCode(52221);
        //                    if (!synonyms.CheckSpecialCharacter('{', '}'))
        //                        return APIHelper.GetErrorMessageByCode(52222);
        //                    if (!synonyms.CheckSpecialCharacter('[', ']'))
        //                        return APIHelper.GetErrorMessageByCode(52223);
        //                    if (!synonyms.CheckSpecialCharacter('"', '"'))
        //                        return APIHelper.GetErrorMessageByCode(52224);
        //                }
        //                if (!item.Synonyms.Contains(keyword))
        //                {
        //                    item.Synonyms.Add(keyword);
        //                }
        //                string synonymsStr = string.Join(",", item.Synonyms);
        //                if (synonymsStr.Length > 4000)
        //                    return APIHelper.GetErrorMessageByCode(52225);
        //            }
        //        }
        //        return null;
        //    }
        //    return APIHelper.GetErrorMessageByCode(52238);
        //}
        //protected async Task<ErrorInfo> IntentValidation(Intent intent, Guid botId, int siteId, bool isSupportComplex)
        //{
        //    if (intent == null)
        //        return APIHelper.GetErrorMessageByCode(50001);
        //    if (intent.Questions == null || intent.Questions.Count <= 0)
        //        return APIHelper.GetErrorMessageByCode(51207);
        //    if (intent.Answer == null || intent.Answer.Count <= 0)
        //        return APIHelper.GetErrorMessageByCode(51208);
        //    if (intent.Answer.All(a => a.Value == null || a.Value.Responses == null || a.Value.Responses.Count <= 0))
        //        return APIHelper.GetErrorMessageByCode(51371);
        //    if (string.IsNullOrWhiteSpace(intent.Name))
        //        return APIHelper.GetErrorMessageByCode(51209);
        //    if (intent.Name.Length > 100)
        //        return APIHelper.GetErrorMessageByCode(51210);
        //    if (intent.Name.Equals("default", StringComparison.InvariantCultureIgnoreCase))
        //        return APIHelper.GetErrorMessageByCode(51211);
        //    if (intent.CategoryId == Guid.Empty)
        //        return APIHelper.GetErrorMessageByCode(51303);
        //    BotCatagory category = _botCatagoryService.Find(intent.CategoryId);
        //    if (category == null || category.IsDeleted)
        //        return APIHelper.GetErrorMessageByCode(51304, new object[] { intent.CategoryId });
        //    if (category.SiteId != siteId)
        //        return APIHelper.GetErrorMessageByCode(51305, new object[] { intent.CategoryId, siteId });
        //    if (category.BotId != botId)
        //        return APIHelper.GetErrorMessageByCode(51306, new object[] { intent.CategoryId, botId });
        //    Dictionary<Guid, List<string>> valData = new Dictionary<Guid, List<string>>();
        //    string regexStr = @"^(?![0-9_-])[a-zA-Z0-9_-]{1,30}$";
        //    if (intent.Questions != null && intent.Questions.Count > 0)
        //    {
        //        if (intent.Questions.GroupBy(g => g.Text.Trim()).Any(a => a.Count() > 1))
        //            return APIHelper.GetErrorMessageByCode(51350);
        //        if (intent.Questions.Count > 2000)
        //            return APIHelper.GetErrorMessageByCode(51254);
        //        List<string> allLabels = new List<string>();
        //        for (int i = 0; i < intent.Questions.Count; i++)
        //        {
        //            if (string.IsNullOrWhiteSpace(intent.Questions[i].Text)) return APIHelper.GetErrorMessageByCode(51353);
        //            if (intent.Questions[i].Text.Length > 768) return APIHelper.GetErrorMessageByCode(51255);
        //            if (intent.Questions[i].EntityLabels == null || intent.Questions[i].EntityLabels.Count <= 0) continue;
        //            List<string> labels = new List<string>();
        //            List<Tuple<int?, int?>> positions = new List<Tuple<int?, int?>>();
        //            foreach (var item in intent.Questions[i].EntityLabels)
        //            {
        //                if (string.IsNullOrWhiteSpace(item.Label))
        //                    return APIHelper.GetErrorMessageByCode(51256);
        //                if (item.Label.Length > 30)
        //                    return APIHelper.GetErrorMessageByCode(51257);
        //                if (item.Label.Trim().EndsWith("_") || item.Label.Trim().EndsWith("-")
        //                    || item.Label.Trim().StartsWith("_") || item.Label.Trim().StartsWith("-") ||
        //                    !Regex.IsMatch(item.Label, regexStr))
        //                    return APIHelper.GetErrorMessageByCode(51258);
        //                if (item.EntityId == Guid.Empty)
        //                    return APIHelper.GetErrorMessageByCode(51259);
        //                var entityDto = _botEntitiesService.Find(item.EntityId);
        //                if (entityDto == null)
        //                    return APIHelper.GetErrorMessageByCode(51307, new object[] { item.EntityId });
        //                if (entityDto.SiteId != siteId)
        //                    return APIHelper.GetErrorMessageByCode(51308, new object[] { item.EntityId, siteId });
        //                if (entityDto.BotId != botId)
        //                    return APIHelper.GetErrorMessageByCode(51309, new object[] { item.EntityId, botId });
        //                if (item.StartPos > item.EndPos)
        //                    return APIHelper.GetErrorMessageByCode(51260);
        //                int length = intent.Questions[i].Text.Length;
        //                if (item.StartPos >= length)
        //                    return APIHelper.GetErrorMessageByCode(51335, new object[] { item.StartPos, length });
        //                if (item.EndPos > length)
        //                    return APIHelper.GetErrorMessageByCode(51336, new object[] { item.EndPos, length });
        //                if (labels.Contains(item.Label))
        //                    return APIHelper.GetErrorMessageByCode(51327, new object[] { item.Label });
        //                else
        //                    labels.Add(item.Label);
        //                if (!allLabels.Contains(item.Label))
        //                {
        //                    allLabels.Add(item.Label);
        //                }
        //                foreach (var key in valData.Keys)
        //                {
        //                    if (valData[key].Contains(item.Label) && item.EntityId != key)
        //                        return APIHelper.GetErrorMessageByCode(51330, new object[] { item.Label, item.EntityId });
        //                }
        //                if (valData.Keys.Contains(item.EntityId))
        //                    valData[item.EntityId].Add(item.Label);
        //                else
        //                    valData.Add(item.EntityId, new List<string>() { item.Label });
        //                foreach (var pos in positions)
        //                {
        //                    if (item.StartPos >= pos.Item1 && item.StartPos <= pos.Item2)
        //                        return APIHelper.GetErrorMessageByCode(51328, new object[] { item.StartPos, pos.Item1, pos.Item2 });
        //                    if (item.EndPos >= pos.Item1 && item.EndPos <= pos.Item2)
        //                        return APIHelper.GetErrorMessageByCode(51329, new object[] { item.EndPos, pos.Item1, pos.Item2 });
        //                }
        //                positions.Add(new Tuple<int?, int?>(item.StartPos, item.EndPos));
        //            }
        //        }
        //        if (allLabels.Count > 20)
        //            return APIHelper.GetErrorMessageByCode(51366);
        //    }
        //    //1. via prompts 时，promot数量大于0,小于等于30，长度最长为768
        //    //2. via form 时，字段数量大于0，entity 长度大于0，entityLabel 长度在0-30之间
        //    //option个数小于等于10，字段长度小于20
        //    //entity name  / entitylabel 只能允许输入 A-Z ,a-z ,0-9, _ - 之内的字符,长度在30以内。
        //    //button上的文字最长20
        //    if (intent.IfRequireDetailInfo && (intent.EntityCollectionType == null
        //        || (intent.EntityCollectionType != EnumEntityCollectionType.form
        //        && intent.EntityCollectionType != EnumEntityCollectionType.prompt)))
        //        return APIHelper.GetErrorMessageByCode(51261);
        //    //if (intent.IfRequireDetailInfo && (intent.Questions.All(a => a.EntityLabels == null || a.EntityLabels.Count <= 0)))  //2019.6.24 取消信息收集前必须包含Entity
        //    //    return APIHelper.GetErrorMessageByCode(51354);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.prompt
        //        && (intent.EntityCollectionPrompts == null || intent.EntityCollectionPrompts.Count <= 0)) return APIHelper.GetErrorMessageByCode(51262);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form
        //        && (intent.EntityCollectionForm == null || intent.EntityCollectionForm.FormFields == null || intent.EntityCollectionForm.FormFields.Count <= 0))
        //        return APIHelper.GetErrorMessageByCode(51263);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form && intent.EntityCollectionForm != null
        //       && string.IsNullOrWhiteSpace(intent.EntityCollectionForm.FormMessage))
        //        return APIHelper.GetErrorMessageByCode(51264);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form && intent.EntityCollectionForm != null
        //        && string.IsNullOrWhiteSpace(intent.EntityCollectionForm.FormTitle))
        //        return APIHelper.GetErrorMessageByCode(51265);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form && intent.EntityCollectionForm != null
        //         && intent.EntityCollectionForm.FormMessage.Length > 1280)
        //        return APIHelper.GetErrorMessageByCode(51266);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form && intent.EntityCollectionForm != null
        //        && intent.EntityCollectionForm.FormTitle.Length > 20)
        //        return APIHelper.GetErrorMessageByCode(51267);
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.form)
        //    {
        //        var errorInfo = ValidateEntityCollectionFormFields(intent.EntityCollectionForm.FormFields, valData, botId, siteId, regexStr);
        //        if (errorInfo != null) return errorInfo;
        //    }
        //    if (intent.IfRequireDetailInfo && intent.EntityCollectionType == EnumEntityCollectionType.prompt)
        //    {
        //        var errorInfo = ValidateEntityCollectionPrompts(intent.EntityCollectionPrompts, valData, botId, siteId, regexStr);
        //        if (errorInfo != null) return errorInfo;
        //    }
        //    List<string> channels = new List<string>();
        //    foreach (var key in intent.Answer.Keys)
        //    {
        //        string channel = key.ToLower();
        //        if (channels.Contains(channel))
        //            return APIHelper.GetErrorMessageByCode(51339);
        //        channels.Add(channel);
        //        if (channel == ConstChannelType.Default || channel == ConstChannelType.Livechat || channel == ConstChannelType.Facebook || channel == ConstChannelType.Twitter)
        //            continue;
        //        return APIHelper.GetErrorMessageByCode(51340);
        //    }
        //    //if(!channels.Contains(ConstChannelType.Default))
        //    //    return APIHelper.GetErrorMessageByCode(51355);
        //    foreach (var key in intent.Answer.Keys)
        //    {
        //        //if (key.Equals(ConstChannelType.Default, StringComparison.InvariantCultureIgnoreCase))
        //        //{
        //        //    if (intent.Answer[key].Responses == null || intent.Answer[key].Responses.Count <= 0)
        //        //        return APIHelper.GetErrorMessageByCode(51355);
        //        //}
        //        if (intent.Answer[key].Responses == null || intent.Answer[key].Responses.Count <= 0)
        //            continue;
        //        //return APIHelper.GetErrorMessageByCode(51355);
        //        ErrorInfo error = AnswerValidation(intent.Answer[key], key, botId, siteId, isSupportComplex);
        //        if (error != null) return error;
        //    }
        //    return null;
        //}
        //public ErrorInfo IntentValidationForAddQuestions(IntentDto intentDto, Guid botId, int siteId)
        //{
        //    ErrorInfo errorInfo = null;
        //    if (intentDto.Questions != null && intentDto.Questions.Count > 0)
        //    {
        //        if (intentDto.Questions.GroupBy(g => g.Question.Trim()).Any(a => a.Count() > 1))
        //            return APIHelper.GetErrorMessageByCode(51350);
        //        if (intentDto.Questions.Count > 2000)
        //            return APIHelper.GetErrorMessageByCode(51254);

        //        for (int i = 0; i < intentDto.Questions.Count; i++)
        //        {
        //            if (string.IsNullOrWhiteSpace(intentDto.Questions[i].Question)) return APIHelper.GetErrorMessageByCode(51353);
        //            if (intentDto.Questions[i].Question.Length > 768) return APIHelper.GetErrorMessageByCode(51255);
        //        }
        //    }
        //    return errorInfo;
        //}
        //public ErrorInfo ValidateEntityCollectionFormFields(List<EntityCollectionFormField> fields,
        //    Dictionary<Guid, List<string>> labels, Guid botId, int siteId, string regexStr)
        //{
        //    List<string> existLabel = new List<string>();
        //    List<EnumFieldType?> fieldTypes = new List<EnumFieldType?>();
        //    fieldTypes.Add(EnumFieldType.text);
        //    fieldTypes.Add(EnumFieldType.textArea);
        //    fieldTypes.Add(EnumFieldType.radio);
        //    fieldTypes.Add(EnumFieldType.checkBox);
        //    fieldTypes.Add(EnumFieldType.checkBoxList);
        //    fieldTypes.Add(EnumFieldType.dropDownList);
        //    foreach (var item in fields)
        //    {
        //        //if (string.IsNullOrWhiteSpace(item.Label))
        //        //    return APIHelper.GetErrorMessageByCode(51268);

        //        if (!string.IsNullOrEmpty(item.Label))
        //        {
        //            if (item.Label.Length > 30)
        //                return APIHelper.GetErrorMessageByCode(51269);
        //            if (item.Label.Trim().EndsWith("_") || item.Label.Trim().EndsWith("-")
        //            || item.Label.Trim().StartsWith("_") || item.Label.Trim().StartsWith("-") ||
        //            !Regex.IsMatch(item.Label, regexStr))
        //                return APIHelper.GetErrorMessageByCode(51270);
        //            if (item.EntityId == Guid.Empty)
        //                return APIHelper.GetErrorMessageByCode(51271);
        //            var entityDto = _botEntitiesService.Find(item.EntityId);
        //            if (entityDto == null)
        //                return APIHelper.GetErrorMessageByCode(51317, new object[] { item.EntityId });
        //            if (entityDto.SiteId != siteId)
        //                return APIHelper.GetErrorMessageByCode(51318, new object[] { item.EntityId, siteId });
        //            if (entityDto.BotId != botId)
        //                return APIHelper.GetErrorMessageByCode(51319, new object[] { item.EntityId, botId });
        //            if (!labels.Keys.Contains(item.EntityId))
        //                return APIHelper.GetErrorMessageByCode(51331, new object[] { item.EntityId });
        //            if (!labels[item.EntityId].Contains(item.Label))
        //                return APIHelper.GetErrorMessageByCode(51333, new object[] { item.EntityId, item.Label });
        //            if (existLabel.Contains(item.Label))
        //            {
        //                return APIHelper.GetErrorMessageByCode(51338, new object[] { item.Label });
        //            }
        //            else
        //            {
        //                existLabel.Add(item.Label);
        //            }
        //        }

        //        if (item.Options != null)
        //        {
        //            if (item.Options.Count > 10)
        //                return APIHelper.GetErrorMessageByCode(51272);
        //            foreach (var option in item.Options)
        //            {
        //                if (string.IsNullOrWhiteSpace(option))
        //                    return APIHelper.GetErrorMessageByCode(51273);
        //                if (option.Length > 100)
        //                    return APIHelper.GetErrorMessageByCode(51274);
        //            }
        //        }
        //        if (!fieldTypes.Contains(item.FieldType))
        //            return APIHelper.GetErrorMessageByCode(51275);
        //        if (string.IsNullOrWhiteSpace(item.FieldName))
        //            return APIHelper.GetErrorMessageByCode(51276);
        //        if (item.FieldName.Length > 128)
        //            return APIHelper.GetErrorMessageByCode(51277);
        //    }
        //    return null;
        //}
        //public ErrorInfo ValidateEntityCollectionPrompts(List<EntityCollectionPrompt> entityCollectionPrompts,
        //    Dictionary<Guid, List<string>> labels, Guid botId, int siteId, string regexStr)
        //{
        //    List<string> existLabel = new List<string>();
        //    foreach (var item in entityCollectionPrompts)
        //    {
        //        if (string.IsNullOrWhiteSpace(item.Label))
        //            return APIHelper.GetErrorMessageByCode(51278);
        //        if (item.Label.Length > 30)
        //            return APIHelper.GetErrorMessageByCode(51279);
        //        if (item.Label.Trim().EndsWith("_") || item.Label.Trim().EndsWith("-")
        //          || item.Label.Trim().StartsWith("_") || item.Label.Trim().StartsWith("-") ||
        //          !Regex.IsMatch(item.Label, regexStr))
        //            return APIHelper.GetErrorMessageByCode(51280);
        //        if (item.EntityId == Guid.Empty)
        //            return APIHelper.GetErrorMessageByCode(51281);
        //        var entityDto = _botEntitiesService.Find(item.EntityId);
        //        if (entityDto == null)
        //            return APIHelper.GetErrorMessageByCode(51320, new object[] { item.EntityId });
        //        if (entityDto.SiteId != siteId)
        //            return APIHelper.GetErrorMessageByCode(51321, new object[] { item.EntityId, siteId });
        //        if (entityDto.BotId != botId)
        //            return APIHelper.GetErrorMessageByCode(51322, new object[] { item.EntityId, botId });
        //        if (!labels.Keys.Contains(item.EntityId))
        //            return APIHelper.GetErrorMessageByCode(51332, new object[] { item.EntityId });
        //        if (!labels[item.EntityId].Contains(item.Label))
        //            return APIHelper.GetErrorMessageByCode(51334, new object[] { item.EntityId, item.Label });
        //        if (existLabel.Contains(item.Label))
        //        {
        //            return APIHelper.GetErrorMessageByCode(51337, new object[] { item.Label });
        //        }
        //        else
        //        {
        //            existLabel.Add(item.Label);
        //        }
        //        if (item.Options != null)
        //        {
        //            //2016.6.26 取消个数限制
        //            //if (item.Options.Count > 10)
        //            //    return APIHelper.GetErrorMessageByCode(51282);
        //            foreach (var option in item.Options)
        //            {
        //                if (string.IsNullOrWhiteSpace(option))
        //                    return APIHelper.GetErrorMessageByCode(51283);
        //                if (option.Length > 20)
        //                    return APIHelper.GetErrorMessageByCode(51284);
        //            }
        //        }
        //        if (item.Questions == null || item.Questions.Count <= 0)
        //            return APIHelper.GetErrorMessageByCode(51285);
        //        if (item.Questions.Count > 30)
        //            return APIHelper.GetErrorMessageByCode(51286);
        //        foreach (var question in item.Questions)
        //        {
        //            if (string.IsNullOrWhiteSpace(question))
        //                return APIHelper.GetErrorMessageByCode(51287);
        //            if (question.Length > 768)
        //                return APIHelper.GetErrorMessageByCode(51288);
        //        }
        //        if (string.Join(CommonCharacter.Split, item.Questions).Length > 4000)
        //            return APIHelper.GetErrorMessageByCode(51365);
        //    }
        //    return null;
        //}
        //public ErrorInfo AnswerValidation(AnswerSubItem subItem, string channelType, Guid botId, int siteId, bool isSupportComplex)
        //{
        //    List<EnumOpenIn?> openInLst = new List<EnumOpenIn?>();
        //    openInLst.Add(EnumOpenIn.currentWindow);
        //    openInLst.Add(EnumOpenIn.newWindow);
        //    openInLst.Add(EnumOpenIn.sideWindow);
        //    //允许response为空，response为空时认为该channel不存在数据
        //    //response不为空时，对数据做校验
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 10)
        //        return APIHelper.GetErrorMessageByCode(51212);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //       && subItem.IfNeedSignIn && subItem.AnswerSignInSettings == null)
        //        return APIHelper.GetErrorMessageByCode(51213);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //       && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //       && string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.SignInLinkText))
        //        return APIHelper.GetErrorMessageByCode(51214);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //      && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //      && string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.SignInMessage))
        //        return APIHelper.GetErrorMessageByCode(51215);

        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //      && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //      && !subItem.AnswerSignInSettings.IsSSO
        //      && string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.SignInURL))
        //        return APIHelper.GetErrorMessageByCode(51216);

        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //    && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //    && !string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.CustomVariable)
        //    && subItem.AnswerSignInSettings.CustomVariable.Length > 128)
        //        return APIHelper.GetErrorMessageByCode(51347);

        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //        && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //        && subItem.AnswerSignInSettings.SignInLinkText.Length > 128)
        //        return APIHelper.GetErrorMessageByCode(51217);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //        && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null && subItem.AnswerSignInSettings.SignInMessage.Length > 1280)
        //        return APIHelper.GetErrorMessageByCode(51218);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //        && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //        && !string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.SignInURL)
        //        && subItem.AnswerSignInSettings.SignInURL.Length > 1280)
        //        return APIHelper.GetErrorMessageByCode(51219);
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //        && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //        && !subItem.AnswerSignInSettings.IsSSO && !openInLst.Contains(subItem.AnswerSignInSettings.OpenIn))
        //        return APIHelper.GetErrorMessageByCode(51220);

        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0
        //        && subItem.IfNeedSignIn && subItem.AnswerSignInSettings != null
        //        && !subItem.AnswerSignInSettings.IsSSO
        //        && string.IsNullOrWhiteSpace(subItem.AnswerSignInSettings.CustomVariable))
        //        return APIHelper.GetErrorMessageByCode(51356);

        //    var quickResponses = subItem.Responses.Where(w => w.type == EnumAnswerType.quickReply);
        //    if (quickResponses != null && quickResponses.Count() > 1)
        //        return APIHelper.GetErrorMessageByCode(51323);

        //    if (quickResponses != null && quickResponses.Count() == 1)
        //    {
        //        Response quickResponse = quickResponses.FirstOrDefault();
        //        subItem.Responses.Remove(quickResponse);
        //        subItem.Responses.Add(quickResponse);
        //    }

        //    if (isSupportComplex)
        //    {
        //        var complexResponses = subItem.Responses.Where(w => w.type == EnumAnswerType.complex);
        //        if (complexResponses != null && complexResponses.Count() > 1)
        //            return APIHelper.GetErrorMessageByCode(51345);
        //    }
        //    if (subItem != null && subItem.Responses != null && subItem.Responses.Count > 0)
        //    {
        //        foreach (var item in subItem.Responses)
        //        {
        //            ErrorInfo error = ResponseValidation(item, channelType, botId, siteId, isSupportComplex);
        //            if (error != null) return error;
        //        }
        //    }
        //    return null;
        //}
    }

    public interface IBotVerifyDataManager
    {
        ErrorInfo VerifyGet(Chatbot chatbot);
        ErrorInfo VerifyCreate(Chatbot chatbot);
        ErrorInfo VerifyUpdate(Chatbot chatbot, ChatbotUpdateBo chatbotUpdateBo);
        ErrorInfo VerifyDelete(Chatbot chatbot);
    }


    /// <summary>
    /// Bot数据有效性校验
    /// </summary>
    public class BotVerifyDataManager : IBotVerifyDataManager
    {
        private readonly IRepository<Guid, Chatbot> _chatbotRepository;

        public BotVerifyDataManager(IRepository<Guid, Chatbot> chatbotRepository)
        {
            _chatbotRepository = chatbotRepository;
        }

        public ErrorInfo VerifyCreate(Chatbot chatbot)
        {
            //List<string> types = new List<string>() {
            //    EnumBotType.comm100Bot.ToString(),
            //    EnumBotType.thirdPartyBot.ToString(),
            //    EnumBotType.comm100OwnBot.ToString(),
            //};
            //if (string.IsNullOrWhiteSpace(bot.Engine))
            //{
            //    bot.Engine = EnumBotType.comm100Bot.ToString();
            //    //2019.6.25 需要去数据库查下，siteid下面设置的默认引擎的类型，如果存在则取数据库的值，如果没有则默认comm100Bot
            //    SiteDefaultEngineDto siteDefaultEngineDto = _siteDefaultEngineAppService.Get(siteId);
            //    if (siteDefaultEngineDto != null && siteDefaultEngineDto.Id != Guid.Empty && !string.IsNullOrEmpty(siteDefaultEngineDto.Engine))
            //    {
            //        bot.Engine = siteDefaultEngineDto.Engine;
            //    }
            //}

            throw new NotImplementedException();
        }

        public ErrorInfo VerifyDelete(Chatbot chatbot)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };
            if (chatbot == null || chatbot.Id == Guid.Empty)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            return errorInfo;
        }

        public ErrorInfo VerifyGet(Chatbot chatbot)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };
            if (chatbot == null || chatbot.Id == Guid.Empty)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            return errorInfo;
        }

        public ErrorInfo VerifyUpdate(Chatbot chatbot, ChatbotUpdateBo chatbotUpdateBo)
        {
            throw new NotImplementedException();
        }


        //public ErrorInfo Verify(BotDto oldBot, BotVM botVM)
        //{
        //    ErrorInfo errorInfo = null;
        //    if (oldBot.Engine.Equals(EnumBotType.thirdPartyBot.ToString()))
        //    {
        //        if (string.IsNullOrWhiteSpace(botVM.WebhookTargetUrl))
        //        {
        //            errorInfo = APIHelper.GetErrorMessageByCode(50275);
        //        }
        //        else if (botVM.WebhookTargetUrl.Length > 1280)
        //        {
        //            errorInfo = APIHelper.GetErrorMessageByCode(50279);
        //        }
        //    }
        //    else
        //    {
        //        errorInfo = ValidationBot(botVM);
        //    }

        //    if (errorInfo != null)
        //        return errorInfo;

        //    if (!oldBot.Engine.Equals(EnumBotType.thirdPartyBot.ToString()) && botVM.GreetingMessage != null)
        //    {
        //        foreach (var key in botVM.GreetingMessage.Keys)
        //        {
        //            if (botVM.GreetingMessage[key] != null && botVM.GreetingMessage.Count > 0)
        //            {
        //                if (botVM.GreetingMessage[key].Count > 10)
        //                    return APIHelper.GetErrorMessageByCode(50259);
        //                var quickResponses = botVM.GreetingMessage[key].Where(w => w.type == EnumAnswerType.quickReply);
        //                if (quickResponses != null && quickResponses.Count() > 1)
        //                    return APIHelper.GetErrorMessageByCode(51323);
        //                if (quickResponses != null && quickResponses.Count() == 1)
        //                {
        //                    Response quickResponse = quickResponses.FirstOrDefault();
        //                    botVM.GreetingMessage[key].Remove(quickResponse);
        //                    botVM.GreetingMessage[key].Add(quickResponse);
        //                }
        //                bool isSupportComplex = false;
        //                if (oldBot.GreetingMessage != null && oldBot.GreetingMessage.Any(a => a.Value != null
        //                    && a.Value.Any(ra => ra.Type == EnumAnswerType.complex)))
        //                    isSupportComplex = true;
        //                if (isSupportComplex)
        //                {
        //                    var complexResponses = botVM.GreetingMessage[key].Where(w => w.type == EnumAnswerType.complex);
        //                    if (complexResponses != null && complexResponses.Count() > 1)
        //                        return APIHelper.GetErrorMessageByCode(51345);
        //                }
        //                foreach (var response in botVM.GreetingMessage[key])
        //                {
        //                    if (response.type == EnumAnswerType.webhook)
        //                    {
        //                        return APIHelper.GetErrorMessageByCode(50257);
        //                    }
        //                    errorInfo = _verifyDataManager.ResponseValidation(response, key, oldBot.Id, oldBot.SiteId, isSupportComplex);
        //                    if (errorInfo != null)
        //                        return errorInfo;
        //                }
        //            }
        //        }
        //    }

        //    return errorInfo;
        //}
        //private ErrorInfo ValidationBot(BotVM botVM)
        //{
        //    ErrorInfo errorInfo = null;
        //    if (botVM.PossibleResponsesThreshold <= 0)
        //        errorInfo = APIHelper.GetErrorMessageByCode(50249);
        //    else if (botVM.HighConfidenceScore <= botVM.NoAnswerScore)
        //        errorInfo = APIHelper.GetErrorMessageByCode(50250);
        //    else if (botVM.HighConfidenceScore > 100 || botVM.HighConfidenceScore < 1)
        //        errorInfo = APIHelper.GetErrorMessageByCode(50251);
        //    else if (botVM.NoAnswerScore > 100 || botVM.NoAnswerScore < 0)
        //        errorInfo = APIHelper.GetErrorMessageByCode(50252);

        //    else if (string.IsNullOrWhiteSpace(botVM.AgentIsOnlineText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "AgentIsOnlineText" });
        //    else if (string.IsNullOrWhiteSpace(botVM.AgentIsOfflineText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "AgentIsOfflineText" });
        //    else if (string.IsNullOrWhiteSpace(botVM.TransferAgentMessage))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "TransferAgentMessage" });
        //    else if (string.IsNullOrWhiteSpace(botVM.LeaveAMessageClickedMessage))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "LeaveAMessageClickedMessage" });
        //    else if (string.IsNullOrWhiteSpace(botVM.RequestVisitorLocationMessage))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "RequestVisitorLocationMessage" });
        //    else if (string.IsNullOrWhiteSpace(botVM.LocationButtonText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "LocationButtonText" });
        //    else if (string.IsNullOrWhiteSpace(botVM.SubmitButtonText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "SubmitButtonText" });
        //    else if (string.IsNullOrWhiteSpace(botVM.CancelButtonText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "CancelButtonText" });
        //    else if (string.IsNullOrWhiteSpace(botVM.ConfirmButtonText))
        //        errorInfo = APIHelper.GetErrorMessageByCode(50276, new object[] { "ConfirmButtonText" });
        //    return errorInfo;
        //}
    }

    public interface IEntityVerifyDataManager
    {

    }
    /// <summary>
    /// Entity数据有效性校验
    /// </summary>
    public class EntityVerifyDataManager : IEntityVerifyDataManager
    {

    }

    public interface IIntentVerifyDataManager
    {

    }
    /// <summary>
    /// Intent数据有效性校验
    /// </summary>
    public class IntentVerifyDataManager : IIntentVerifyDataManager
    {

    }

    public interface IQuickReplyVerifyDataManager
    {

    }
    /// <summary>
    /// QuickReply数据有效性校验
    /// </summary>
    public class QuickReplyVerifyDataManager : IQuickReplyVerifyDataManager
    {

    }

    public interface ISmartTriggerVerifyDataManager
    {

    }
    /// <summary>
    /// SmartTrigger数据有效性校验
    /// </summary>
    public class SmartTriggerVerifyDataManager : ISmartTriggerVerifyDataManager
    {

    }

    public interface ICategoryVerifyDataManager
    {
        ErrorInfo VerifyGet(Guid botId);
        ErrorInfo VerifyCreate(Category category);
        ErrorInfo VerifyUpdate(Category category, CategoryUpdateBo categoryUpdateBo);
        ErrorInfo VerifyDelete(Guid id);
        ErrorInfo VerifyReassign(Category category, Guid targetCategoryId);
    }
    public class CategoryVerifyDataManager : ICategoryVerifyDataManager
    {
        private readonly IRepository<Guid, Chatbot> _chatbotRepository;
        private readonly IRepository<Guid, Category> _categoryRepository;
        public CategoryVerifyDataManager(IRepository<Guid, Chatbot> chatbotRepository,
            IRepository<Guid, Category> categoryRepository)
        {
            _chatbotRepository = chatbotRepository;
            _categoryRepository = categoryRepository;
        }

        public ErrorInfo VerifyCreate(Category category)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };
            var bot = _chatbotRepository.Get(category.BotId);
            if (bot == null || bot.Id == Guid.Empty)
            {
                return APIHelper.GetErrorMessageByCode(50004);
            }

            if (bot.EngineType == EnumBotType.thirdPartyBot)
            {
                return APIHelper.GetErrorMessageByCode(50264);
            }

            if (category.ParentId != Guid.Empty)
            {
                var catagoryParent = _categoryRepository.Get(category.ParentId.Value);
                if (catagoryParent == null || catagoryParent.IsDeleted)
                {
                    return APIHelper.GetErrorMessageByCode(50220);
                }

                if (catagoryParent.BotId != category.BotId)
                {
                    return APIHelper.GetErrorMessageByCode(50254);
                }                    
            }

            if (_categoryRepository.Count(new CategoryFilterSpecification(category.BotId,category.Name.Trim())) > 0)
            {
                return APIHelper.GetErrorMessageByCode(50215);
            }               

            return errorInfo;
        }

        public ErrorInfo VerifyDelete(Guid id)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };

            if (category == null || category.IsDeleted)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            var bot = _chatbotRepository.Get(category.BotId);
            if (bot == null || bot.Id == Guid.Empty)
            {
                return APIHelper.GetErrorMessageByCode(50004);
            }

            if (bot.EngineType == EnumBotType.thirdPartyBot)
            {
                return APIHelper.GetErrorMessageByCode(50264);
            }

            return errorInfo;
        }

        public ErrorInfo VerifyGet(Guid botId)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };
            var bot = _chatbotRepository.Get(botId); 

            if(bot == null || bot.Id == Guid.Empty)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            return errorInfo;
        }

        public ErrorInfo VerifyUpdate(Category category, CategoryUpdateBo categoryUpdateBo)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };

            if (category == null || category.IsDeleted)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            var bot = _chatbotRepository.Get(category.BotId);
            if (bot == null || bot.Id == Guid.Empty)
            {
                return APIHelper.GetErrorMessageByCode(50004);
            }

            if (bot.EngineType == EnumBotType.thirdPartyBot)
            {
                return APIHelper.GetErrorMessageByCode(50264);
            }

            if (categoryUpdateBo.ParentId != Guid.Empty)
            {
                var categoryParent = _categoryRepository.Get(categoryUpdateBo.ParentId.Value);
                if (categoryParent == null || categoryParent.IsDeleted)
                {
                    return APIHelper.GetErrorMessageByCode(50220);
                }

                if (categoryParent.BotId != category.BotId)
                {
                    return APIHelper.GetErrorMessageByCode(50254);
                }
            }

            if (_categoryRepository.Count(new CategoryFilterSpecification(category.Id, category.BotId, categoryUpdateBo.Name.Trim())) > 0)
            {
                return APIHelper.GetErrorMessageByCode(50215);
            }

            return errorInfo;
        }

        public ErrorInfo VerifyReassign(Category category, Guid targetCategoryId)
        {
            ErrorInfo errorInfo = new ErrorInfo { Code = 1 };

            if (category == null || category.IsDeleted)
            {
                errorInfo = APIHelper.GetErrorMessageByCode(50004);
            }

            var bot = _chatbotRepository.Get(category.BotId);
            if (bot == null || bot.Id == Guid.Empty)
            {
                return APIHelper.GetErrorMessageByCode(50004);
            }

            if (bot.EngineType == EnumBotType.thirdPartyBot)
            {
                return APIHelper.GetErrorMessageByCode(50264);
            }

            var targetCategory = _categoryRepository.Get(targetCategoryId);
            if (targetCategory == null || targetCategory.IsDeleted)
            {
                return APIHelper.GetErrorMessageByCode(50220);
            }

            if (targetCategory.BotId != category.BotId)
            {
                return APIHelper.GetErrorMessageByCode(50254);
            }

            return errorInfo;
        }
    }
}
